local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local PlayerInfo = IceCore_CreateClass(IceTargetInfo)

local EPSILON = 0.5

PlayerInfo.prototype.mainHandEnchantTimeSet = 0
PlayerInfo.prototype.mainHandEnchantEndTime = 0
PlayerInfo.prototype.offHandEnchantTimeSet = 0
PlayerInfo.prototype.offHandEnchantEndTime = 0
PlayerInfo.prototype.scheduledEvent = nil

-- Constructor --
function PlayerInfo.prototype:init()
	PlayerInfo.super.prototype.init(self, "PlayerInfo", "player")
end

function PlayerInfo.prototype:GetDefaultSettings()
	local settings = PlayerInfo.super.prototype.GetDefaultSettings(self)

	settings["enabled"] = false
	settings["vpos"] = -100
	settings["hideBlizz"] = false

	return settings
end

function PlayerInfo.prototype:GetOptions()
	local opts = PlayerInfo.super.prototype.GetOptions(self)

	opts["hideBlizz"] = {
		type = "toggle",
		name = L["Hide Blizzard Buffs"],
		desc = L["Hides Blizzard's default buffs frame and disables all events related to it"],
		get = function()
			return self.moduleSettings.hideBlizz
		end,
		set = function(info, value)
			self.moduleSettings.hideBlizz = value
			if (value) then
				self:HideBlizz()
			else
				self:ShowBlizz()
			end
		end,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 33.1,
	}

	return opts
end

StaticPopupDialogs["ICEHUD_BUFF_DISMISS_UNAVAILABLE"] =
{
	text = "Sorry, but there is currently no simple way for custom mods to cancel buffs while retaining flexibility in how buffs are displayed. This will be fixed whenever the API is more accessible and I get some free time.",
	button1 = OKAY,
	timeout = 0,
	whileDead = 1,
	hideOnEscape = 0,
}

local function OnBuffMouseUp(frame, button)
	if IceHUD.WowVer >= 40000 then
		if button == "RightButton" then
			StaticPopup_Show("ICEHUD_BUFF_DISMISS_UNAVAILABLE")
		end
	else
--[[		if( button == "RightButton" ) then
			if buffs[i].type == "mh" then
				CancelItemTempEnchantment(1)
			elseif buffs[i].type == "oh" then
				CancelItemTempEnchantment(2)
			else
				CancelUnitBuff("player", i)
			end
		end]]
	end
end

function PlayerInfo.prototype:CreateIconFrames(parent, direction, buffs, type)
	local buffs = PlayerInfo.super.prototype.CreateIconFrames(self, parent, direction, buffs, type)

	for i = 1, IceCore.BuffLimit do
		if (self.moduleSettings.mouseBuff) then
			buffs[i]:SetScript("OnMouseUp", OnBuffMouseUp)
		else
			buffs[i]:SetScript("OnMouseUp", nil)
		end
	end

	return buffs
end

function PlayerInfo.prototype:Enable(core)
	PlayerInfo.super.prototype.Enable(self, core)

	if (self.moduleSettings.hideBlizz) then
		self:HideBlizz()
	end

	self.scheduledEvent = self:ScheduleRepeatingTimer("RepeatingUpdateBuffs", 1)
end

function PlayerInfo.prototype:Disable(core)
	PlayerInfo.super.prototype.Disable(self, core)

	self:CancelTimer(self.scheduledEvent, true)
end

function PlayerInfo.prototype:ShowBlizz()
	BuffFrame:Show()
	TemporaryEnchantFrame:Show()

	BuffFrame:GetScript("OnLoad")(BuffFrame)
end


function PlayerInfo.prototype:HideBlizz()
	BuffFrame:Hide()
	TemporaryEnchantFrame:Hide()

	BuffFrame:UnregisterAllEvents()
end

function PlayerInfo.prototype:RepeatingUpdateBuffs()
	self:UpdateBuffs(self.unit, true)
end

function PlayerInfo.prototype:UpdateBuffs(unit, fromRepeated)
	if unit and unit ~= self.unit then
		return
	end

	if not fromRepeated then
		PlayerInfo.super.prototype.UpdateBuffs(self)
	end

	local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges
		= GetWeaponEnchantInfo()

	local startingNum = 0

	for i=1, IceCore.BuffLimit do
		if not self.frame.buffFrame.iconFrames[i]:IsVisible()
			or self.frame.buffFrame.iconFrames[i].type == "mh"
			or self.frame.buffFrame.iconFrames[i].type == "oh" then
			if startingNum == 0 then
				startingNum = i
			end
		end

		if self.frame.buffFrame.iconFrames[i]:IsVisible() then
			if (self.frame.buffFrame.iconFrames[i].type == "mh" and not hasMainHandEnchant)
				or (self.frame.buffFrame.iconFrames[i].type == "oh" and not hasOffHandEnchant) then
				self.frame.buffFrame.iconFrames[i]:Hide()
			end
		end
	end

	-- no acceptable space found to append weapon buffs, so don't.
	-- either the player already has 40 buffs on him or he's in configuration mode
	if startingNum == 0 then
		return
	end

	if hasMainHandEnchant or hasOffHandEnchant then
		local CurrTime = GetTime()

		if hasMainHandEnchant and startingNum <= IceCore.BuffLimit then
			if self.mainHandEnchantEndTime == 0 or
				abs(self.mainHandEnchantEndTime - (mainHandExpiration/1000)) > CurrTime - self.mainHandEnchantTimeSet + EPSILON then
				self.mainHandEnchantEndTime = mainHandExpiration/1000
				self.mainHandEnchantTimeSet = CurrTime
			end

			if not self.frame.buffFrame.iconFrames[startingNum]:IsVisible() or self.frame.buffFrame.iconFrames[startingNum].type ~= "mh" then
				self:SetupAura("buff",
					startingNum,
					GetInventoryItemTexture(self.unit, GetInventorySlotInfo("MainHandSlot")),
					self.mainHandEnchantEndTime,
					CurrTime + (mainHandExpiration/1000),
					true,
					mainHandCharges,
					nil,
					"mh")
			end

			startingNum = startingNum + 1
		end

		if hasOffHandEnchant and startingNum <= IceCore.BuffLimit then
			if self.offHandEnchantEndTime == 0 or
				abs(self.offHandEnchantEndTime - (offHandExpiration/1000)) > abs(CurrTime - self.offHandEnchantTimeSet) + EPSILON then
				self.offHandEnchantEndTime = offHandExpiration/1000
				self.offHandEnchantTimeSet = CurrTime
			end

			if not self.frame.buffFrame.iconFrames[startingNum]:IsVisible() or self.frame.buffFrame.iconFrames[startingNum].type ~= "oh" then
				self:SetupAura("buff",
					startingNum,
					GetInventoryItemTexture(self.unit, GetInventorySlotInfo("SecondaryHandSlot")),
					self.offHandEnchantEndTime,
					CurrTime + (offHandExpiration/1000),
					true,
					offHandCharges,
					nil,
					"oh")
			end

			startingNum = startingNum + 1
		end

		for i=startingNum, IceCore.BuffLimit do
			if self.frame.buffFrame.iconFrames[i]:IsVisible() then
				self.frame.buffFrame.iconFrames[i]:Hide()
			end
		end

		self.frame.buffFrame.iconFrames = self:CreateIconFrames(self.frame.buffFrame,
			self.moduleSettings.auras["buff"].growDirection,
			self.frame.buffFrame.iconFrames, "buff")
	end
end

-- Load us up
IceHUD.PlayerInfo = PlayerInfo:new()
